package com.gitee.l0km.beanfilter.core;

import java.util.Collections;
import java.util.Set;

/**
 * 组合过滤器接口
 * @author guyadong
 *
 */
public interface ICombinedFilter {

	/**
	 * 如果组合过滤器容器中没有指定类型的过滤器则返回{@code true}
	 * @param type 过滤器类型，为{@code null}或{@link IFilter}时，字段过滤器和值过滤都为空返回{@code true}
	 */
	boolean isEmpty(Class<? extends IFilter> type);

	/**
	 * 如果组合过滤器容器中没有过滤器则返回{@code true}
	 */
	boolean isEmpty();

	/**
	 * 返回指定编/解码阶段和作用范围过滤器关联的所有类型
	 * @param phase 要求的过滤器适用阶段
	 * @param scope 要求的过滤适用编解码目标范围
	 */
	Set<Class<?>> associateClasses(CodecPhase phase, CodecScope scope);

	/**
	 * 返回字段过滤器，如果字段过滤器容器为空返回默认过滤器{@link IFieldFilter#DEFAULT_INSTANCE}
	 */
	IFieldFilter getFieldFilterOrDefault();

	/**
	 * 返回值过滤器，如果值过滤器容器为空返回默认过滤器{@link IValueFilter#DEFAULT_INSTANCE}
	 */
	IValueFilter getValueFilterOrDefault();
	
	public static final ICombinedFilter DEFAULT_INSTANCE = new DefaultCombinedFilter();
	public static class DefaultCombinedFilter implements ICombinedFilter{

		@Override
		public boolean isEmpty(Class<? extends IFilter> type) {
			return true;
		}

		@Override
		public boolean isEmpty() {
			return true;
		}

		@Override
		public Set<Class<?>> associateClasses(CodecPhase phase, CodecScope scope) {
			return Collections.emptySet();
		}

		@Override
		public IFieldFilter getFieldFilterOrDefault() {
			return IFieldFilter.DEFAULT_INSTANCE;
		}

		@Override
		public IValueFilter getValueFilterOrDefault() {
			return IValueFilter.DEFAULT_INSTANCE;
		}
		@Override
		public int hashCode() {
			return getClass().hashCode();
		}
		@Override
		public boolean equals(Object obj) {
			if (this == obj)
				return true;
			if (obj == null)
				return false;
			return getClass() == obj.getClass();
		}
	}

}